/**
 * 规则： 约定大于配置
 * 思路：
 * 1. 获取views目录下的所有page.ts文件. 注：该文件定义了一些路由配置项
 * 2. 获取所有 index.vue 页面. 约定所有的页面都已这个文件名命名
 * 3. 循环所有页面的配置项, 生成路由的配置项
 * 4. 保存title-route的map对象
 * 5. 创建路由
 * 6. 设置全局路由守卫
 * 7. 导出获取动态路由的方法
 */
import { createWebHashHistory, createRouter } from "vue-router"
import type { RouteRecordRaw } from "vue-router"

// 收集所有页面的配置
const pageConfigs = import.meta.glob("../views/**/page.ts", { eager: true, import: "default" })

// 收集所有页面的组件
const components = import.meta.glob("../views/**/index.vue")
// 定义保存路由的map
const routeMap: Map<string, RouteRecordRaw> = new Map()

// 循环页面配置得到每个页面的路由配置
const routes = Object.entries(pageConfigs).map(([pagePath, config]) => {
	const path = pagePath.replace("../views", "").replace("/page.ts", "") || "/"
	const nameArr = path.split("/")
	const name = nameArr.filter(Boolean).join("-") || "index"
	const componentPath = pagePath.replace("page.ts", "index.vue")
	return {
		path,
		name,
		component: components[componentPath],
		meta: config,
	}
})

// 循环路由配置保存到map中
routes.forEach((route: any) => {
	const title = route.meta.title
	routeMap.set(title, route)
})

console.log(routes)

// 创建路由
const router = createRouter({
	history: createWebHashHistory(),
	routes: Array.from(routeMap.values()),
})

// 设置下一级路由的文档标题
router.beforeEach(async (to, _, next) => {
	const baseTitle = ""
	if (to.meta.title) {
		document.title = `${to.meta.title} - ${baseTitle}`
	} else {
		document.title = baseTitle
	}
	next()
})

export default router

// 获取动态的路由路径
export const getPath = (t: string) => {
	return routeMap.get(t)?.path || "/"
}
